package com.briup.emdc.client.impl;

import com.briup.emdc.bean.Env;
import com.briup.emdc.client.Gather;
import com.briup.emdc.config.Configuration;
import com.briup.emdc.config.Log;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Properties;

/**
 * @author Kevin
 * @since 2024.04.10
 **/
public class GatherImpl implements Gather{
    private Log log;
    private String srcLogFile;
    private String fieldSeparator;

    @Override
    public Collection<Env> gather() throws Exception{
        FileInputStream fis=new FileInputStream(srcLogFile);
        InputStreamReader isr=new InputStreamReader(fis);
        BufferedReader br=new BufferedReader(isr);
        log.debug("创建了流对象，增在读取文件！");

        List<Env> list=new ArrayList<>();
        log.debug("创建了集合对象");

        String line;
        while((line=br.readLine())!=null){
            // log.info("正在按行读取数据，读到的数据是："+line);
            // split方法的参数是正则表达式
            // 竖线“|”在正则表达式中又特殊含义，表示“或”
            String[] strs=line.split(fieldSeparator);
            // 数据清洗
            if(strs.length!=9) continue;
            String srcId=strs[0];
            String dstId=strs[1];
            String devId=strs[2];
            String sersorAddress=strs[3];
            int count=Integer.parseInt(strs[4]);
            String cmd=strs[5];
            int status=Integer.parseInt(strs[7]);
            Timestamp gatherDate=new Timestamp(Long.parseLong(strs[8]));
            switch(strs[3]){
                // 就能解析出两个数据（温度，湿度），
                // 即能封装两个Env对象
                case "16":{
                    // 封装温度的Env对象
                    String name="温度";
                    // 从原始数据中解析出前四个16进制的字符
                    // 即表示2个字节
                    String tempStr=strs[6].substring(0,4);
                    // 将2个字节的16进制的字符串转成10进制
                    int tempInt=Integer.parseInt(tempStr,16);
                    // 按照公式转化成实际的温度值
                    float temp=(float)((tempInt*0.00268127)-46.85);

                    Env tempEnv=Env.builder().name(name).srcId(srcId).dstId(dstId).devId(devId).sersorAddress(sersorAddress).count(count).cmd(cmd).status(status).data(temp).gatherDate(gatherDate).build();
                    list.add(tempEnv);

                    String name1="湿度";
                    String humStr=strs[6].substring(4,8);
                    int humInt=Integer.parseInt(humStr,16);
                    float hum=(float)((humInt*0.00190735)-6);
                    Env humEnv=Env.builder().name(name1).srcId(srcId).dstId(dstId).devId(devId).sersorAddress(sersorAddress).count(count).cmd(cmd).status(status).data(hum).gatherDate(gatherDate).build();
                    list.add(humEnv);
                    break;
                }
                case "256":{
                    String name="光照强度";
                    float ill=Integer.parseInt(strs[6],16);
                    Env illEnv=Env.builder().name(name).srcId(srcId).dstId(dstId).devId(devId).sersorAddress(sersorAddress).count(count).cmd(cmd).status(status).data(ill).gatherDate(gatherDate).build();
                    list.add(illEnv);
                    break;
                }
                case "1280":{
                    String name="二氧化碳浓度";
                    float co2=Integer.parseInt(strs[6],16);
                    Env co2Env=Env.builder().name(name).srcId(srcId).dstId(dstId).devId(devId).sersorAddress(sersorAddress).count(count).cmd(cmd).status(status).data(co2).gatherDate(gatherDate).build();
                    list.add(co2Env);
                    break;
                }
            }
        }
        return list;
    }

    @Override
    public void init(final Properties prop){
        srcLogFile=prop.getProperty("src-log-file");
        fieldSeparator=prop.getProperty("field-separator");
    }

    @Override
    public void configure(final Configuration conf) throws Exception{
        this.log = conf.getLogger();
    }
}
